home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 25 / CU Amiga Magazine's Super CD-ROM 25 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-08].iso / CUCD / Programming / QuakeTools / src / include / mathlib.h < prev   
Encoding:
C/C++ Source or Header  |  1998-06-11  |  2.2 KB  |  77 lines

  1. #ifndef MATHLIB_H
  2. #define MATHLIB_H
  3. // mathlib.h
  4. #include <math.h>
  5.  
  6. /*
  7. #ifndef    scalw
  8. #ifdef    scalb
  9. #define    scalw(x, y)    scalb((x), (y))
  10. #else
  11. #define    scalw(x, y)    (((y) >= 0) ? ((x) * (1 << (y))) : ((x) / (1 << (-y))))
  12. #endif
  13. #endif
  14.  */
  15.  
  16. typedef    float    vec_t;
  17. typedef vec_t    vec3_t[3];
  18.  
  19. #define    SIDE_FRONT        0
  20. #define    SIDE_ON            2
  21. #define    SIDE_BACK        1
  22. #define    SIDE_CROSS        -2
  23.  
  24. #define    Q_PI    3.14159265358979323846
  25.  
  26. #define    EQUAL_EPSILON    0.001
  27.  
  28. #define VectorCompare(v1, v2) (((v1[0] != v2[0]) || (v1[1] != v2[1]) || (v1[2] != v2[2])) ? 0 : 1)
  29. #define VectorZero(v1) ((v1[0] == 0) && (v1[1] == 0) && (v1[2] == 0))
  30.  
  31. #define DotProduct(x,y) (x[0]*y[0]+x[1]*y[1]+x[2]*y[2])
  32. #define VectorSubtract(a,b,c) {c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];}
  33. #define VectorAdd(a,b,c) {c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];}
  34. #define VectorCopy(a,b) {b[0]=a[0];b[1]=a[1];b[2]=a[2];}
  35. #define VectorClear(x) {x[0] = x[1] = x[2] = 0;}
  36. #define    VectorNegate(x) {x[0]=-x[0];x[1]=-x[1];x[2]=-x[2];}
  37. #define    VectorNegateTo(x, y) {y[0]=-x[0];y[1]=-x[1];y[2]=-x[2];}
  38. #define    VectorAbs(x) {fabs(x[0]);fabs(x[1]);fabs(x[2]);}
  39.  
  40. #define _DotProduct DotProduct
  41. #define _VectorSubtract VectorSubtract
  42. #define _VectorAdd VectorAdd
  43. #define _VectorCopy VectorCopy
  44.  
  45. #define VectorLength(v) (sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]))
  46. #define VectorDist(v) (v[0]*v[0] + v[1]*v[1] + v[2]*v[2])
  47.  
  48. void VectorMA(vec3_t veca, double scale, vec3_t vecb, vec3_t vecc);
  49. void CrossProduct(vec3_t v1, vec3_t v2, vec3_t cross);
  50. vec_t VectorNormalize(vec3_t v);
  51.  
  52. extern inline void VectorMA(vec3_t veca, double scale, vec3_t vecb, vec3_t vecc) {
  53.   vecc[0] = veca[0] + scale * vecb[0];
  54.   vecc[1] = veca[1] + scale * vecb[1];
  55.   vecc[2] = veca[2] + scale * vecb[2];
  56. }
  57.  
  58. extern inline void CrossProduct(vec3_t v1, vec3_t v2, vec3_t cross) {
  59.   cross[0] = v1[1] * v2[2] - v1[2] * v2[1];
  60.   cross[1] = v1[2] * v2[0] - v1[0] * v2[2];
  61.   cross[2] = v1[0] * v2[1] - v1[1] * v2[0];
  62. }
  63.  
  64. extern inline vec_t VectorNormalize(vec3_t v) {
  65.   vec_t len = VectorLength(v);
  66.   if(len) {
  67.     v[0] /= len;
  68.     v[1] /= len;
  69.     v[2] /= len;
  70.   }
  71.   return len;
  72. }
  73.  
  74. #define VectorInverse(v) ({v[0] = -v[0]; v[1] = -v[1]; v[2] = -v[2];})
  75. #define VectorScale(in, scale, out) ({out[0] = in[0] * scale; out[1] = in[1] * scale; out[2] = in[2] * scale;})
  76. #endif
  77.